#include "gear.h"
#include "lvgl/lvgl.h"
#include "ui/ui.h"
#include <stdio.h>

// 档位名称定义
const char *gear_names[] = {
    "P档", 
    "R档", 
    "N档", 
    "D档", 
    "S档"
};

// 档位UI对象数组定义
lv_obj_t *gear_ui_objects[5];

// 当前档位状态(默认为N档)
Gear current_gear = GEAR_N;

void init_gear_ui() {
    // 首先检查数组大小是否匹配
    const size_t gear_ui_count = sizeof(gear_ui_objects)/sizeof(gear_ui_objects[0]);
    const size_t gear_names_count = sizeof(gear_names)/sizeof(gear_names[0]);
    
    if (gear_ui_count != gear_names_count) {
        printf("错误: 档位UI对象(%zu)与名称数组(%zu)大小不匹配\n", 
               gear_ui_count, gear_names_count);
        return;
    }
    // 初始化档位UI对象数组
    gear_ui_objects[0] = ui_pdangon; // P档
    gear_ui_objects[1] = ui_rdangon; // R档
    gear_ui_objects[2] = ui_ndangon; // N档
    gear_ui_objects[3] = ui_ddangon; // D档
    gear_ui_objects[4] = ui_sdangon; // S档

    // 初始化所有档位UI对象为隐藏状态
    for (int i = 0; i < 5; i++) {
        if (gear_ui_objects[i]) {
            lv_obj_add_flag(gear_ui_objects[i], LV_OBJ_FLAG_HIDDEN);
        }
    }
    
    // 设置默认档位(N档)为可见
    if (gear_ui_objects[GEAR_N]) {
        lv_obj_clear_flag(gear_ui_objects[GEAR_N], LV_OBJ_FLAG_HIDDEN);
    }
}

void handle_gear_change(Gear new_gear) {
    const size_t gear_count = sizeof(gear_names)/sizeof(gear_names[0]);

    if ((int)new_gear < 0 || (int)new_gear >= (int)(sizeof(gear_names)/sizeof(gear_names[0]))) {
    printf("无效档位值: %d\n", (int)new_gear);
    return;
    }

    // 更新当前档位
    current_gear = new_gear;
    
    // 更新UI显示
    for (int i = 0; i < 5; i++) {
        if (gear_ui_objects[i]) {
            if (i == (int)new_gear) {
                lv_obj_clear_flag(gear_ui_objects[i], LV_OBJ_FLAG_HIDDEN);
            } else {
                lv_obj_add_flag(gear_ui_objects[i], LV_OBJ_FLAG_HIDDEN);
            }
        }
    }
    
    printf("档位已切换至: %s\n", gear_names[(int)new_gear]);
}

Gear get_current_gear() {
    return current_gear;
}

const char *get_current_gear_name() {
    return gear_names[(int)current_gear];
}